package negocio;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map.Entry;

import persistencia.DAOFactory;
import modelo.*;

public class Inicializar {
	private static Tablero tablero = Tablero.getInstacia();
	private static DAOFactory f = DAOFactory.getDAOFactory();
	
	public static void inicializarJuego(){
		// Cargar base
		f.getInicializacionDAO().createTablas();
		f.getInicializacionDAO().cargarTablas();
		
		inicializarTablero();
		inicializarEventos();
	}

	public static void setearMetas(String meta, Integer valor){
		Jugador jugador= Jugador.getInstacia();
		if(meta.equals("educacion")){
			jugador.getMeta().setEducacion(valor);	
		}
		if(meta.equals("felicidad")){
			jugador.getMeta().setFelicidad(valor);			
		}
		if(meta.equals("riqueza")){
			jugador.getMeta().setRiqueza(valor);			
		}
		if(meta.equals("carrera laboral")){
			jugador.getMeta().setCarreraLaboral(valor);		
		}
	}
	
	public static void setearNombre(String nombre){
		Jugador jugador= Jugador.getInstacia();
		jugador.setNombre(nombre);
	}
	
	public static void inicializarTablero(){
		HashMap<Integer, Lugar> lugaresAux = f.getLugarDAO().cargarLugares();
		Iterator<Entry<Integer, Lugar>> it = lugaresAux.entrySet().iterator();
		
		// Para cada lugar cargo sus objetos
		while(it.hasNext()){
			Lugar lugar = it.next().getValue();
			
			System.out.println("Parsing: " + lugar.getNombre());
			
			// Carga de acciones y empleo
			lugar.setListaAcciones(f.getAccionDAO().cargarAccion(lugar.getId()));
			lugar.setListaEmpleo(cargarEmpleoCompleto(lugar.getId()));
			
			// Verificaciones de tipo de lugares
			if(lugar instanceof Mercado){
				Mercado mercado = (Mercado) lugar;
				mercado.setHashElectrodomestico(f.getArticuloDAO().cargarArticulo(mercado.getId()));
			}
			
			else
				if(lugar instanceof Universidad){
					Universidad uni = (Universidad) lugar;
					ArrayList<Carrera> listaCarrera = f.getCarreraDAO().cargarCarrera();
					
					// Cargo cursos por cada carrera y asigno carreras
					cargarCurso(listaCarrera);
					uni.setListaCarrera(listaCarrera);
				}
			
				else
					if(lugar instanceof Hamburgueseria){
						Hamburgueseria ham = (Hamburgueseria) lugar;
						ham.setListaComida(f.getComidaDAO().cargarComida());
					}
					
					else
						if(lugar instanceof Departamento){
							Departamento depto = (Departamento) lugar;
							Departamento aux = f.getDepartamentoDAO().cargarDepartamento(depto.getId());
							depto.setCostoAlquiler(aux.getCostoAlquiler());
							depto.setEsSeguro(aux.getEsSeguro());
						}
			
			System.out.println("Parsed");
		}
		
		tablero.setLugares(lugaresAux);
	}
	
	public static ArrayList<Empleo> cargarEmpleoCompleto(Integer idLugar){
		ArrayList<Empleo> listaEmpleos = f.getEmpleoDAO().cargarEmpleo(idLugar);
		
		if(listaEmpleos == null)
			return null;
		
		Iterator<Empleo> it = listaEmpleos.iterator();
		
		// Para cada empleo carga restricciones
		while(it.hasNext()){
			Empleo empleo = it.next();
			
			empleo.setIdCursosReq(f.getRequisitoCursoDAO().cargarRequisitoCurso(empleo.getId()));
			empleo.setIdEmpleosReq(f.getRequisitoEmpleoDAO().cargarRequisitoEmpleo(empleo.getId()));
		}
		
		return listaEmpleos;
	}
	
	public static void cargarCurso(ArrayList<Carrera> lista){
		Iterator<Carrera> it = lista.iterator();
		
		while(it.hasNext()){
			Carrera carrera = it.next();
			carrera.setListaCursos(f.getCursoDAO().cargarCurso(carrera.getIdCarrera()));
		}
	}
	
	public static void inicializarEventos(){
		// Inicialmente carga todos los eventos
		ArrayList<Evento> lista = f.getEventoDAO().cargarEvento();
		
		// Separo en eventos buenos y malos segun valor
		ArrayList<Evento> listaBuenos = new ArrayList<Evento>();
		ArrayList<Evento> listaMalos = new ArrayList<Evento>();
		Iterator<Evento> it = lista.iterator();
		
		while(it.hasNext()){
			Evento evento = it.next();
			
			if(evento.getCosto() < 0)
				listaMalos.add(evento);
				
			else
				listaBuenos.remove(evento);
		}
		
		tablero.setEventosBuenos(listaBuenos);
		tablero.setEventosMal(listaMalos);
	}
}